# coding:utf-8
from decimal import Decimal as D
import decimal

def format_rate(rate):
    """
    :function:将利率转为百分比的形式,至少保留两位小数
    :author: 熊家炳 2017-06-07
    :param rate: 利率 如0.023，0.06534，兼容类型float,Decimal,str
    :return: 类型string，如0.23%，6.534%
    """
    if rate:
        print ('t=', type(rate))
        rtn_rate = ''
        rate_str = ''
        if isinstance(rate, str):                                   # 字符串
            first = rate[0]
            if first == '0':                                        # 首位是否为0
                rate_str = str(int(rate[2:]))
            else:
                rate_str = first + rate[2:]                         # 去除小数点
            rate = float(rate)                                      # 字符串转float
            rtn_rate = str(rate * 100) + '%'                        # 返回的利率格式
        else:
            rate_str = str(int(rate * 100000000))                   # 8位小数
            if isinstance(rate, decimal.Decimal):                   # 数字
                rate = float(rate)
            rtn_rate = str(rate * 100) + '%'
        rate_len = len(rate_str)
        if rate_len >= 7:
            reverse_rate = rate_str[::-1]                           # 逆序
            reverse_rate_len = len(str(int(reverse_rate)))          # 转成int，去除0
            if reverse_rate_len <= 3:
                rtn_rate = '{:.2f}'.format(rate * 100) + '%'        # rate_len>=7,逆反后的长度<=3,则格式化，否则直接乘以100
        return rtn_rate
    else:
        return '0.00%'


def splitBankNoBySpace(bank_no):
    """
    :function:银行账号，每隔四位隔开
    :author:熊家炳 20170614
    :param bank_no: 类型str
    :return:
    """
    bank_no = str(bank_no).replace(' ','')
    no_len = len(bank_no)
    if no_len>4 and bank_no.isdigit():                          # 账号必须是数字
        lst = []
        times = no_len / 4 + 1 if no_len % 4 != 0 else no_len / 4
        start=0
        for i in range(times):
            end = start+4
            lst.append(bank_no[start:end])
            start = end
        return ' '.join(lst)
    else:
        return bank_no


def is_chinese(uchar):
    """
    :function:判断一个unicode是否是汉字
    :param uchar:unicode字符串
    :return:
    """
    print ('uchar',uchar)
    if uchar < u'\u4e00' or  uchar > u'\u9fa5':
        return True
    else:
        return False


def is_number(num_string):
    """
    :function:判断一个unicode是否是数字
    :param uchar:unicode字符串
    :return:
    """
    import re
    # print 'str(num_string)=',str(num_string)
    # return re.match(r"d+$",num_string) and True or False
    # return re.match(r'[+-]?\d+$',num_string) and True or False
    # print re.match(r'[+-]?d+$', '1234')
    return num_string.isdigit()


def about_dict():
    dictionary = {'one':'one','two':'two'}
    key = 'one'
    ##############字典中查找键##############
    #######方法一：
    # for k in dictionary.keys():
    #     if key == k:
    #         print dictionary[key]
    #         break
    ########方法二：
    # if key in dictionary:
    #     print dictionary[key]
    # else:
    #     print 'not exist.'

    ##############初始化##############
    #######方法一：
    # dictionary = {}
    # if "key" not in dictionary:
    #     dictionary["key"] = []
    # # dictionary["key"].append("list_item")
    # print dictionary

    #######方法二：
    # 字典调用 setdefault 方法时，首先检查 key 是否存在
    # 如果存在，该方法什么也不做；如果不存在，setdefault会创建该key，并把第二个参数[]作为 key 对应的值。
    # dictionary.setdefault("key", []).append("list_item")
    # print dictionary


    ##############初始化字典##############
    #######方法一：
    # if 'a' not in dictionary:
    #     dictionary['a'] = 100
    # dictionary['a'] += 10
    # print dictionary
    #######方法二：
    # from collections import defaultdict
    # d = defaultdict(lambda: 100)
    # d['a'] += 10

    #######使用 iteritems() 迭代大数据#######
    #######方法一
    #######items() 返回的是一个 list，list 在迭代的时候会预先把所有的元素加载到内存
    # d = {i: i * 2 for i in xrange(100)}
    # for key, value in d.items():
    #     print("{0} = {1}".format(key, value))
    #######方法二
    ####### iteritems() 返回的一个迭代器(iterators)，迭代器在迭代的时候，迭代元素逐个的生成
    # d = {i: i * 2 for i in xrange(100)}
    # for key, value in d.iteritems():
    #     print("{0} = {1}".format(key, value))

    ##############高效合并字典##############
    #######方法一
    #######items()方法在python2.7中返回的是列表对象，两个列表相加得到一个新的列表，这样内存中存在3个列表对象
    x = {'a': 1, 'b': 2}
    y = {'b': 3, 'c': 4}
    # z = dict(x.items() + y.items())
    # print z

    #######方法二
    # z = x.copy()
    # z.update(y)

    #######封装成函数
    def merge_dicts(*dict_args):  # 可以接收1个或多个字典参数
        result = {}
        for dictionary in dict_args:
            result.update(dictionary)
        return result
    z = merge_dicts(x,y)
    print z


def randDif(k,n):                # 新函数,生成k个1到n之间不相等的随机数
    import random
    if k>n:
        return []
    a = range(1,n+1)
    random.shuffle(a)
    return a[:k]


def format_cn_money(money):
    """
    :function:小写金额转为大写
    :author:熊家炳 2017-06-19
    :return:
    """
    if not isinstance(money, str):
        money = list('{:.2f}'.format(money))                        # 去除空格
    i = 1
    cn_money = []                                                   # 大写金额
    # 1-数字转大写
    while(i<=len(money)):                                           # 从右到左取值
        cn_dict={'.':u'元','0':u'零','1':u'壹','2':u'贰','3':u'叁','4':u'肆','5':u'伍','6':u'陆','7':u'柒','8':u'捌','9':u'玖'}
        cn_unit={1:u'分',2:u'角',3:u'',4:u'',5:u'拾',6:u'佰',7:u'仟',8:u'万',9:u'拾',10:u'佰',11:u'仟',12:u'亿',13:u'拾',14:u'佰',15:u'仟',16:u'万'}
        cn_money.append(cn_dict[money[-i]]+cn_unit[i])              # 金额与单位
        i +=1
    cn_money = ''.join(cn_money[::-1])

    # 2-处理特殊字符
    special_dict = [
        {u'零拾': u'零'},
        {u'零佰': u'零'},
        {u'零仟': u'零'},
        {u'零零零': u'零'},
        {u'零零': u'零'},
        {u'零角零分': u'整'},
        {u'零分': u'整'},
        {u'零角': u'零'},
        {u'零亿零万零元': u'亿元'},
        {u'亿零万零元': u'亿元'},
        {u'零亿零万': u'亿'},
        {u'零万零元': u'万元'},
        {u'万零元': u'万元'},
        {u'零亿': u'亿'},
        {u'零万': u'万'},
        {u'零元': u'元'},
        {u'零零': u'零'}
    ]
    for s in special_dict:
        for k,v in s.items():
            cn_money = cn_money.replace(k,v)

    # 3-处理壹元以下的金额
    cn_money_head = [u'元',u'零',u'角',u'分']
    for h in cn_money_head:
        if cn_money[0] == h:
            cn_money = cn_money[1:]
    if cn_money[0] == u'整':
        cn_money = u'零元整'
    return cn_money


if __name__ == '__main__':
    format_cn_money(123001.12)
    # about_dict()
    # print is_number(u'121q34')

    # print is_chinese(u'123见附件123')   # True
    # print is_chinese(u'见附件123')      # False
    # print is_chinese(u'见附件')         # False

    # print splitBankNoBySpace('123 321  12  3123 12')
    # print format_rate(D('0.16123000'))
    # print format_rate(0.06123456)
    # print format_rate('0.06000000')